package com.weixiaodong.javabasic.Java中的大数运算;

/**
 *  注意：对于任何运算而言，计算机底层都是将其转化为二进制进行操作，所以我们定义的所有的浮点数，例如1.1, 0.99999999f等等，只是肉眼看上去的数字
 *  实际上在进行运算，例如==或者+都会将其转化为二进制之后才进行
 *
 *  浮点数如何转化为二进制呢?  假设任意给定一个浮点数：x.y 其中x为整数部分，y为小数部分
 *      x的二进制就和平常的整数求二进制一样，通过不断 x % 2 和 x /= 2即可
 *      但是对于小数部分，就完全相反，是通过不断的 x *= 2, 然后取出当前x的整数部分作为二进制，然后对其小数部分重复
 *
 *  出现下面的原因可以从计算机组成原理中的浮点数表示说起，浮点数的定义是严格遵循IEEE 754 浮点数计数标准，即1.M...2^E
 *  其中M为尾码部分，E为阶码部分，具体的float和double的表示如下：
 *                     符号为(1bit)             阶码部分(8bit/11bit)          尾码部分(23bit/52bit)
 *        float             S                          E                            M
 *        double            S                          E                            M
 *  S = 0表示为负数， S = 1表示正数
 */
public class errorDemo {
    public static void main(String[] args) {
        /**
         *  Demo1 为什么会出现下面的原因?
         */
        float a = 1.0f;
        float b = 0.9999999f;
        float c = 0.99999999f;
        System.out.println(a == b); // false
        System.out.println(a == c); // true

        /**
         * Demo2 为什会出现下面的原因?
         */
        float d = 1.1f;
        double e = (double) d;
        System.out.println(d); // 1.1
        System.out.println(e); // 1.100000023841858

        /**
         * Demo3
         */
        System.out.println(0.2 + 0.7); // 0.8999999999999999

        /**
         * Demo4
         */
        float f1 = 8455263f;  // 正常的
        for (int i = 0; i < 10; i++) {
            System.out.println(f1);
            f1++;
        }

        System.out.println("++++++++++++");

        float f2 = 84552631f; // 始终不变 8.4552632E7
        for (int i = 0; i < 10; i++) {
            System.out.println(f2);
            f2++;
        }
    }
}
